package com.munhra.dinamica.reports;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

import com.munhrasoft.dinamica.business.entities.Processo;
import com.munhrasoft.dinamica.viewmodels.CapaProcesso;

/**
 * Dentro desta classe estarao os metodos para a construcao dos relatorios via
 * jasper. Para otimizar esta classe pegar o que e comum nos metodos de impressao abaixo
 * e criar um metodo privado com a parte comum, construir tambem opcao de imprimir em html, doc e
 * outros formatos que podem ser setados por parametros nos sistema
 * 
 * @author munhra
 * 
 */

public class Reports {

	public static void imprimeRelatorioCapa(CapaProcesso capa) throws IOException, JRException {
		// TODO tratar excecao do jasper dentro deste metodo
	
		List<CapaProcesso> listaCapa = new ArrayList<CapaProcesso>();
		listaCapa.add(capa);

		JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(
				listaCapa);

		String reportPath = FacesContext.getCurrentInstance()
				.getExternalContext()
				.getRealPath("/reports/capa/capa_processo.jasper");

		JasperPrint jasperPrint = JasperFillManager.fillReport(reportPath,
				new HashMap(), beanCollectionDataSource);

		HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext
				.getCurrentInstance().getExternalContext().getResponse();

		httpServletResponse.addHeader("Content-disposition",
				"attachment; filename=CapaDeProcesso.pdf");

		ServletOutputStream servletOutputStream = httpServletResponse
				.getOutputStream();

		JasperExportManager.exportReportToPdfStream(jasperPrint,
				servletOutputStream);

		FacesContext.getCurrentInstance().responseComplete();
	
	
	}

	public static void imprimeRelatorioPendencias(Processo relatProcesso)
			throws IOException, JRException {

		// TODO tratar excecao do jasper dentro deste metodo

		/*
		 * Existe um problema com o jasper, nao tem como fazer com ajax, toda a
		 * tela vai ser perdida. uma solucao para isso e deixar so para o final
		 * a impressao do relatorio, entao sempre que o usuario clicar no botao
		 * imprimir vai imprimir o relatorio e navegar para a pagina inicial ou
		 * para a propria pagina do relatorio. Ia ser legal fazer isso de
		 * maneira assincrona.
		 * 
		 * O que ocorre se nao fizer isso e que os dados do managedebean serao
		 * perdidos isso acontece sempre que tentar imprimir duas vezes o
		 * relatorio sem sair da pagina
		 */

		List<Processo> reportProcesso = new ArrayList<Processo>();
		reportProcesso.add(relatProcesso);

		JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(
				reportProcesso);

		String reportPath = FacesContext.getCurrentInstance()
				.getExternalContext()
				.getRealPath("/reports/pendencias/pendencias.jasper");

		JasperPrint jasperPrint = JasperFillManager.fillReport(reportPath,
				new HashMap(), beanCollectionDataSource);

		HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext
				.getCurrentInstance().getExternalContext().getResponse();

		httpServletResponse.addHeader("Content-disposition",
				"attachment; filename=pendencias.pdf");

		ServletOutputStream servletOutputStream = httpServletResponse
				.getOutputStream();

		JasperExportManager.exportReportToPdfStream(jasperPrint,
				servletOutputStream);

		FacesContext.getCurrentInstance().responseComplete();

	}

}
